1. 进程的有哪几种状态
- 就绪状态:进程已经分配到除了CPU以外的所有必要资源,只要活得处理机边可以执行
- 执行状态:已获得处理机,正在执行
- 阻塞状态:由于等待某个时间发生而无法执行,放弃处理机
比如等待IO,申请缓冲区不能满足,等待信号量等
2.进程与线程的区别。
线程的引入是为了减少程序在冰法执行时的时空开销,使os具有更好的并发性,从而进一步提高了资源的利用率和系统的吞吐量。
- 调度:在传统的os中用友资源的基本单位和独立调度、分派的基本单位都是进程;在引入线程的os中,则把线程作为系统调度和分派的基本单位,而把进程作为拥有资源的基本单位。
- 拥有资源:两种os中用友资源的基本单位都是进程。线程除了一点在运行中必不可少的资源外,本身基本不拥有资源,但它可以访问其隶属进程的资源。
- 并发性:在引入线程的os中,不仅进程之间可以并发执行,而且同一个进程的多个线程之间也可以并发执行,因此他具有更好的并发性。
- 系统开销:由于在创建或撤销进程的时候,系统要为之分配或回收资源。由于隶属同一个进程的多个线程共享同一空间和地址,以及该进程的所有已打开文件,从而使他们之间的同步和通信的实现也比进程更方便。
3.进程通信的几种方式。
- 共享存储器系统:
(1)基于共享数据结构的通信方式。(此通信方式抵消,只适用于传递相对少量的数据)
(2)基于共享存储区的通信方式:为了传送大量数据,在存储区中划出一块共享存储区,所有的进程可通过对共享存储区进行读或写数据实现通讯,可传输大量数据。
- 消息传递系统:
(1)直接通信方式消息缓冲:采用进程的消息缓冲队列;消息发送者将消息直接放在接受者的消息缓冲队列。
(2)间接通信方式:利用中间信箱、邮局来传递信件;发送进程将消息发送到信箱中,接受进程从信箱中提取出消息。
(3)管道通信:所谓管道,是指链接两个进程的一个打开的共享文件,又名pipe文件;发送进程以字符流形式将大量的数据送入管道;接收进程则在需要时从管道中读取数据。
4.线程同步几种方式。
- 临界区当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到用友临界区的线程放弃临界区为止。
- 事件事件机制,则允许一个线程在处理完了一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A Cevent类对象有两种类型:人工事件和自动事件。
5. 线程的实现方式.
就是用户线程与内核线程的区别:实现线程有两种 继承Thread类或者实现Runnable接口
CreateThread()和_beginthreadex()的区别:函数在创建新线程时会分配并初始化一个_tiddata块。这个_tiddata块自然是用来存放一些需要线程独享的数据。事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问和修改自己的数据而不会去篡改其它线程的数据了。因此,如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread()。
6. 多线程同步和互斥有何异同
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
7. 用户态和核心态的区别。
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
状态切换的方式:系统调用,异常,中断
8. 内存池、进程池、线程池。
平常我们使用new、malloc在堆区申请一块内存,但由于每次申请的内存大小不一样就会产生很多内存碎片,造成不好管理与浪费的情况内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。