1、有关多线程,多进程的描述错误的是
正确答案:D
A 子进程获得父进程的数据空间,堆和栈的复制品
B 线程可以与同进程的其他线程共享数据,但是它拥有自己的栈空间且拥有独立的执行序列
C 线程执行开销小,但是不利于资源管理和保护
D 进程适合在SMP机器上进行,而线程则可以跨机器迁移
题解:
1、SMP:Symmetrical Multi-Processing,对称性多核处理器,多进程可以在不同的核上运行,但是线程不可以跨机器迁移,因为线程是存在于单一的进程之中,只能在一个核上运行
2、 选D 。 SMP是Symmetric Multi Processing的简称,意为对称多处理系统,内有许多紧耦合多处理器,这种系统最大的特点就是共享所有资源。 与之相对立的标准是 MPP(Massively Parallel Processing),意为大规模并行处理系统,这样的系统是由许多松耦合处理单元组成的,这里指的是处理单元而不是处理器。每个单元内的CPU都有自己私有的资源,如总线、内存、硬盘灯。在每个单元内都有操作系统和管理 数据库 的实例副本。这种结构最大的特点在于不共享资源。 因而线程更适合在SMP机器上进行,而进程则可以跨机器迁移。
3、 多进程可以在不同的核上运行,但是线程不可以跨机器迁移,因为线程是存在于单一的进程之中,只能在一个核上运行
2、多个线程可同时操作一个数据,为了保证该数据的准确性,可将操作该数据的部分改为:
正确答案:D
A 只写
B 只读
C 异步
D 同步
题解:
1、答案:D 对该数据加锁,放在同步代码块中 synchronize(){ }
2、 答案:D 对该数据加锁,放在同步代码块中 synchronize(){ }
3、 只读也保证了数据的准确性和一致性呢 感觉应该选B D
4、 链接:https://www.nowcoder.com/questionTerminal/0061be88463e4949863f68ba38175ae9?toCommentId=7323 来源:牛客网 1. 并发:在 操作系统 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行。其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。 3. 同步: 进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。 其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。 4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。 5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。 6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立
5、在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。 异步和多线程并不是一个同等关系
6、异步是最终目的
7、多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者
8、而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。
3、设在内存中有P1,P2,P3三道程序,并按照P1,P2,P3的优先级次序运行,其中内部计算和IO操作时间由下表给出(CPU计算和IO资源都只能同时由一个程序占用): P1:计算60ms—》IO 80ms—》计算20ms P2:计算120ms—》IO 40ms—》计算40ms P3:计算40ms—》IO 80ms—》计算40ms 并行完成三道程序比单道运行节省的时间是()
正确答案:C
A 80ms
B 120ms
C 160ms
D 200ms
题解:
1、 题意,CPU操作和IO操作可以并行,所以节约的时间就是二者平行的时间。
4、下列哪种操作可能带来死锁?
正确答案:C
A lock(m1) lock(m2) unlock(m1) unlock(m2)
B lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
C lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
D lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)
题解:
1、 假设有两个线程,线程1执行到lock(m1)
2、lock(m2)
3、unlock(m1),此时线程1持有锁m2
4、想要获取锁m1;线程2执行到lock(m1)
5、此时线程2持有锁m1
6、想要获取锁m2。两个线程都拿着对方想要得到的锁,造成死锁。
7、 1 2 3 4 5 6 lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1) 对于C选项:假设有A、B两个线程并发执行 当A执行完3,占有m2时,申请m1. 当B执行完1,占有m1,申请m2时 这时死锁就发生了。
5、产生系统死锁的原因是由于()
正确答案:C
A 进程释放资源
B 一个进程进入死循环
C 多个进程竞争,资源出现循环等待
D 多个进程竞争共享型设备
题解:
1、 C 产生死锁的原因主要是: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。 D选项:共享型设备是指在一段时间内允许多个进程同时访问的设备
2、 D选项:共享型设备是指在一段时间内允许多个进程同时访问的设备
6、竞选条件(race condition)的情况下,两线程执行如下代码段,其中count为共享变量,线程1执行代码段A,线程2指向代码段B,那么变量count的值可能为 int count = 10; 代码段A: Thread_1()
{
//do something
count++;
}
代码段B: Thread_2()
{
//do something
count–;
}
正确答案:ABC
A 9
B 10
C 11
D 12
题解:
1、 ABC ++和–并非原子操作,存在被打断的可能性。 A:线程1先执行,++后数据未及时写入内存便被线程2打断,执行完线程2,数据已被更改,输出9 B:顺序正常执行 C:线程2先执行,–后数据未及时写入内存便被线程1打断,执行完线程1,数据已被更改,输出11
2、 要么先执行线程1,要么先执行线程2,然后根据自增自减运算符得出数来,除了12,其他数都有可能。
7、下列关于多线程,多进程,多任务的区别与关系描述正确的有?
正确答案:ABC
A 线程是指进程内的一条执行线路,或者说是进程中可执行代码的单独单元,它是操作系统的基本调度单元。
B 一个进程至少有一个线程,即主线程,也可以有多个线程协同工作。
C 进程从主线程开始执行,进而可以创建一个或多个附加线程来执行该进程内的并发任务,这就是基于线程的多任务。
D 上述描述都是错误的
题解:
1、 这题A错了吧… 基本调度单元不是进程么,线城市资源分配的基本单元吧
2、 现在操作系统中,申请资源的基本单位是进程,在CPU得到执行的基本单位是线程。进程由程序段,数据段,PCB组成
8、数据库以及线程发生死锁的必要条件是什么?
正确答案:ABCD
A 互斥条件:一个资源每次只能被一个进程使用
B 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
C 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
D 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
题解:
1、 产生死锁的原因主要是: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2、 1.互斥 2.占有等待 3.非剥夺 4.循环等待
9、有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?
正确答案:BCD
A 1
B 2
C 3
D 4
题解:
1、大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的 第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。 第二种可能情况:再假设现在第一个n++ 已经执行完了 但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++ 结果就为2。 第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断 第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2 第二个n++再执行 结果就是3了
2、 如前面大佬@琥珀大川说的2-4 可能的原因,我尝试说一下1 为啥不行 一进程执行两次n++, 二进程 n+=2; 无论如何,两个进程都会进行一次读取n的数值,和写回操作。且两个进程都会要运行完自己的程序块。 二进程每次都是+2,不会出现1 一进程虽然两次分开+1,但是只要运行完进程结果就是2,除非运行完第一个n++写回后,n的数值被改回0。显然不会出现这种情况
3、 // ++ 和 += 都不是原子操作,所有都可能被中断,结果就是 2 ~ 4 都可以
10、轮询任务调度与抢占式任务调度的区别?
正确答案:BD
A 抢占式调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
B 轮询调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
C 轮询调度实现相对较复杂
D 抢占式调度实现相对较复杂
题解:
1、 成功的避开了正确的答案
2、 两个都是任务调度方式,目的都是一样的。简单的区别我是觉得:你养了几只狗,然后要喂它们, 轮询相当于一个一个的喂,中途不能换狗;抢占是喂一个喂到一半,另外的狗也要喂,等于这边喂点,那边喂点 ,这时要记得谁吃的多和少,以方便合理喂食物。
答案汇总:
1、正确答案:D
2、正确答案:D
3、正确答案:C
4、正确答案:C
5、正确答案:C
6、正确答案:ABC
7、正确答案:ABC
8、正确答案:ABCD
9、正确答案:BCD
10、正确答案:BD
以上部分题解来自牛客评论区,感谢评论区大佬的解释。