Linux小测
作者:互联网
1.在bash中,在一条命令后加入"1>&2"意味着:标准输出重定向到标准错误输出。
0 | 1 | 2 |
---|---|---|
标准输入 | 标准输出 | 标准错误 |
2.无锁化编程有哪些常见方法?
- 针对计数器,可以使用原子加。
原子操作是汇编级别支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是对其的封装。简单变量的线程同步用这种方式效率最高。
- 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)。
多个生产者和多个消费者,一样可以做到免锁访问,但要使用原子操作。这里的意思应该是不用原子操作级别的免锁,理由也很简单,生产者和消费者需要修改的位置是分开的(生产者加在尾部,消费者从头部消费),且只有一个读一个写,不会发生冲突。所以只有一点需要关注,就是尾部指针和头部指针每次需要比较以避免生产溢出或者过度消费,而简单变量的读操作都是原子的。
- RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法。
类似的一个概念叫CopyOnWrite,复制一份,修改完后,替换回去时只需替换一个指针或引用,锁住的粒度非常小。但有可能还有线程持有的是旧的指针,因此旧的副本需要延迟释放。
- CAS(Compare-and-Swap),如无锁栈,无锁队列等待。
汇编级别支持的指令cmpxchg,锁定内存地址,比较地址中修改前的内容是否与修改时的值一致,如果不一致就说明有其他线程改动,需要重新做。
3.Unix系统下,哪些可以用于进程间通信?
- 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
- 命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
- 消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
- 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
4.题目描述:输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入格式:输入有多组数据。每组一行,输入n。
输出格式:输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
样例输入:
100
样例输出:
11 31 41 61 71
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> Vector;
bool isnumber(int number)
{
for(int i=2;i<=sqrt(number);i++){
if(number%i==0){
return false;
}
}
return true;
}
int main()
{
int n;
while(cin>>n){
for(int i=2;i<n;i++){
if(isnumber(i)&&i%10==1){
Vector.push_back(i);
}
}
if(Vector.size()==0){
cout<<"-1"<<endl;
}
else{
for(int i=0;i<Vector.size()-1;i++){
cout<<Vector[i]<<" ";
}
cout<<Vector[Vector.size()-1]<<endl;
}
Vector.clear();
}
return 0;
}
标签:输出,小测,队列,间通信,管道,线程,Linux,进程 来源: https://blog.csdn.net/weixin_43264873/article/details/104861161