Linux ——进程 一

发布于:2023-01-04 ⋅ 阅读:(178) ⋅ 点赞:(0)

1.冯诺依曼体系结构

在这里插入图片描述
输入设备:键盘、鼠标、扫描仪、写板······
中央处理器(cpu):含有运算器和控制器等(算术运算 + 逻辑计算)
输出单元:显示器、打印机等

关于冯诺依曼,必须强调几点:
1. 这里的存储器指的是内存
2. 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3. 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
4. 一句话,所有设备都只能直接和内存打交道

操作系统

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)

设计操作系统的目的

  • 与硬件进行交互,管理所有软硬件资源
  • 为用户提供一个良好的执行环境

定位
操作系统是一款进行管理的软件

在这里插入图片描述
在这里插入图片描述

进程

在这里插入图片描述
unistd
查看进程的方式

ps -axj
在这里插入图片描述
在每一个进程中,都会存在一个唯一的标识符,这个标识符就像每个学生的学号一样。被叫做PID (process ID)
在这里插入图片描述
在这里插入图片描述
通过 getpid() 来获得进程的pid
通过**getppid()**来获得父进程的pid

在这里插入图片描述
每次运行程序时,子进程pid总是在变,但是父进程pid好像没变过,父进程是谁呢?
——父进程是bash 几乎我们在命令行上面执行的所有指令,都是bash的子进程。

创建子进程
fork()

fork函数有两个返回值,给子进程返回0,给父进程返回子进程的pid
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Linux 进程状态

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Z(zombie)-僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

僵尸进程危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空
间!内存泄漏?是的!
如何避免?后面讲

孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,当然要有init进程回收喽

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到