进程和线程

进程的概念:运行中的程序。程序:存储在磁盘上的可执行文件。

进程创建:1、给新进程分配一个唯一的进程标识号,此时在主进程表中增加一个新项目,表中的每个项目指向一个进程。(进程标识号部分包括进程ID和其他相关的ID)。2、给进程分配空间。3、初始化进程控制块4、设置正确的连接。例如,如果操作系统把每个调度队列都保存成链表,则新进程必须放置在就绪或挂起链表中。5、创建或扩充其他数据结构。

 1)fork 复制进程的过程  

调用get_ pid()为新进程获取一个有效的PID。

    调用dup_ task struct()为新进程创建-一个内核栈、thread_ info结 构和task_ struct, 这些值与当前进程的值相同。此时,子进程和父进程的描述符是完全相同的。

    检查新创建的这个子进程后,当前用户所拥有的进程数目没有超出给他分配的资源的限制。现在,子进程着手使自己与父进程区别开来。进程描述符内的许多成员都要被清0或设为初始值。进程描述符的成员值并不是继承而来的,而主要是统计信息。进程描述符中的大多数数据都是共享的。

    接下来,子进程的状态被设置为TASK UNINTERRUPTIBLE以保证它不会投人运行。

    copy_process()调用copy_ flags()以更新task struct的flags成员。表明进程是否拥有超级用户权限的PF_ SUPERPRIV标志被清0。表明进程还没有调用exec()函数的PF_ FORKNOEXEC标志被设置。

根据传递给clone()的参数标志,copy_ process<)拷贝或共享打开的文件,文件系统信息、信号处理函数、进程地址空间和命名空间等。在一般情况下,这些资源会被给定进程的所有线程共享;否则,这些资源对每个进程是不同的,因此被拷贝到这里。让父进程和子进程平分剩余的时间片(第4章将作具体讨论)。最后,copy_ process()作扫尾工作并返回一个指向子进程的指针。

Fork()时哪些资源被复制?哪些资源被共享?

复制:互斥锁,不是同一个锁,但是状态相同

父进程打开的文件,fork()后,子进程与父进程共享。

2)僵死进程概念处理方法 

     

      操作系统通过PCB(进程控制块)记录进程的相关属性(pid、ppid、优先级、程序计数器、程序上下文等)PCB在内存上存,他不能记录进程的过程,只能记录过程的相关信息。

      程序计数器:记录当前执行指令的下一行地址。

      进程控制块就是一个结构体。管理PCB的基本的数据结构是一个双向循环链表。新进程生成时,必须先分配PCB结构,后才生成进程主体。进程结束时,先释放主体满足一定条件后才会释放PCB结构。

       僵死进程:进程主体释放,但是PCB依旧保存。子进程先于父进程结束,父进程没有调用wait获取子进程的退出码,这时子进程变成僵死进程。当父进程结束后,init收养子进程,这时父进程结束,init调用wait获取子进程的退出码,处理掉子进程。

操作系统为每个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫页表,页表的内容就是该进程的虚拟地址到物理地址的一个映射

3)写时拷贝技术的作用  

      传统的fork()系统调用直接把所有的资源复制给新建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟糕的情况是:如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃,Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝,也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读的方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。如果fork()之后立即调用exec()他们就无需复制了。Fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会使用的数据(地址空间里常常包含数十兆的数据)。由于unix强调进程快速执行的能力,所以这个优化过程是很重要的。

4)进程控制块 pcb

进程控制块就是一个结构体。管理PCB的基本的数据结构是一个双向循环链表。新进程生成时,必须先分配PCB结构,后才生成进程主体。进程结束时,先释放主体满足一定条件后才会释放PCB结构。(在Linux下又被称为进程描述符)

5)进程状态转移图: 就绪、运行、阻塞

运行:CPU正在执行进程中的指令。

就绪:等待CPU执行的过程。

阻塞:等待I/O事件的发生等。

运行——阻塞:缺某些资源

阻塞——就绪:资源满足,等待再次调度

运行——就绪:时间片用完

 

6)并发运行与并行区别

     并发是指一个处理器同时处理多个任务。指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。单核只能并发。

     并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。指在同一时刻,有多条指令在多个处理器上同时执行。无论从微观上还是宏观来看,二者都是一起执行的。

Ipcs:可以查看进程间通信:信号量 共享内存 消息队列

Ipcrm :删除

线程:进程内部的一条执行路径(执行序列)

多线程:是指操作系统支持在一个进程中执行多个线程的能力。每个进程中只有一个线程在执行的传统方法称为单线程方法。

进程中的所有线程共享该进程的状态和资源,他们驻留在同一块地址空间中,并且可以反问道相同的数据。当一个数据改变了存储器中的一个数据项时,其他线程在访问这一数据项时能够看到变化后的结果。如果一个线程为读操作打开一个文件,那么同一个进程中的其他线程也能够从这个文件中读取数据。从性能比较可以看出线程的重要有点如下:

1、在一个已有进程中创建一个新线程比创建一个全新进程所需的时间要少许多。

2、终止一个线程要比终止一个进程花费的时间少。

3、同一进程内线程间切换比进程间切换花费的时间少。

4、线程提高了不同的执行程序间通信的效率。

线程的实现可以分为两类:用户级线程和内核级线程。后者又称为内核支持的线程或轻量级进程 。默认情况下,应用程序从单线程起始,并在该线程中开始运行。

线程的实现:

用户级:由线程库的代码管理  创建开销小  只能实现并发  创建 切换 销毁  开销比较小,不由内核管理。在一个纯粹的用户级线程中,有关线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在。任何应用程序可以通过使用线程库设计成多线程程序,线程库是用于用户级线程管理的一个例程包。

内核级:由内核创建 内核管理  开销大  创建 切换等开销比较大  ,由内核直接管理,但可以在多处理器上实现并行。在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核级线程设施的应用程序编程接口。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值