当前位置: 首页 > news >正文

Linux学习笔记-应用层篇

1、Linux进程、线程概念/区别
Linux进程和线程是计算机系统中两种不同的资源分配和调度单位。

进程是计算机系统进行资源分配和调度的基本单位,也被认为是正在运行的程序。在面向线程的计算机结构中,进程是线程的容器。进程拥有独立的内存和系统资源,并且它的创建、销毁和切换等操作都需要付出较大的开销。进程间的数据共享需要操作系统的干预,同时进程的逻辑控制相对复杂,需要和主程序进行交互,以及需要跨进程边界。

线程是一种轻量级的进程,没有系统资源,可以被看作是进程中的一条执行路径。线程是操作系统调度的最小单位,它与进程相比,切换的开销较小。在一个进程内部,多个线程之间可以共享资源,并且线程间通信更简单,因为它们共享相同的地址空间和数据。线程的创建、销毁和切换等操作也相对于进程来说较简单。

总的来说,进程和线程在资源分配、工作效率和执行方式上有明显的区别。进程拥有独立的资源,而线程则是轻量级的进程,没有独立资源。进程切换时需要保留资源,而线程切换时不需要保留资源。此外,进程可以被操作系统直接调度,而线程则必须在进程中运行。
2、进程、线程的同步方式
Linux进程和线程的同步方式有多种,以下是一些常见的方式:

  1. 进程间的同步方式:

信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

  1. 线程间的同步方式:

互斥锁(Mutex):通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

条件变量(Condition Variable):与互斥锁结合使用,用于线程间的同步。当某个条件不满足时,线程可以等待,直到条件满足为止。

信号量(Semaphore):同样可以用于线程间的同步。

无锁互斥访问(Lock-Free Access):通过一些特殊的技术,使得多个线程在并发条件下对共享资源进行无锁访问的方式。例如,使用原子操作或CAS操作等。

需要注意的是,进程和线程的同步方式主要是为了解决并发访问共享资源时可能出现的冲突和竞争条件,保证数据的一致性和正确性。不同的同步方式具有不同的特点和适用场景,需要根据实际情况进行选择和设计。
3、锁的概念,互斥锁、自旋锁等
锁是计算机科学中用于实现并发控制的一种同步机制。在多线程编程中,锁被用来防止多个线程同时访问共享资源,避免数据竞争和状态不一致的问题。

互斥锁(Mutex)是一种常用的锁机制,其基本原理是当一个线程获取了互斥锁后,其他尝试获取该锁的线程将会被阻塞,直到原线程释放该锁。这样可以确保每个时刻只有一个线程可以访问共享资源。

自旋锁(spinlock)是一种非阻塞锁,当一个线程尝试获取锁而失败时,它不会像互斥锁那样进入阻塞状态,而是继续循环尝试获取锁,同时消耗CPU时间。自旋锁适合用于短时间内的资源保护,避免频繁的线程上下文切换带来的开销。

在使用这些锁时,需要注意避免死锁和饥饿问题。死锁是指多个线程相互等待对方释放锁,导致所有线程都无法继续执行的情况。饥饿问题是某些线程长时间无法获取到锁,从而使其他线程一直执行而无法获得机会获取锁的问题。

另外,还有读写锁(read-write lock)这种锁,允许多个线程同时读取共享资源,但在写入时需要独占式的访问。这样可以提高并发性能,适用于读操作远多于写操作的情况。
4、fork clone
在Linux下,fork和clone都是用于创建进程的技术。

  1. Fork(分叉):在Linux中,fork()系统调用用于创建一个新的进程,该进程是原始进程的副本。新进程(子进程)继承原始进程(父进程)的代码、数据、打开的文件描述符等。子进程有一个新的进程ID,并且其大部分状态与父进程相同,但也有一些状态(如PID、父PID等)是不同的。fork()调用返回两次:一次在父进程中返回子进程的PID,另一次在子进程中返回0。
  2. Clone(克隆):clone()系统调用是Linux 2.6.23版本引入的一种创建新进程的方法,它允许创建一个共享部分或全部地址空间的新进程。clone()调用创建一个新进程,并可以选择性地共享父进程的地址空间(例如堆、栈、代码段等)。这种共享使得新进程可以访问和修改共享地址空间的内容,从而实现更高效的进程间通信。clone()调用返回一个新的进程ID,该ID可以用于识别新创建的进程。

需要注意的是,fork和clone都是Linux系统调用,它们的使用需要遵循相应的系统调用规范和参数约定。在编写使用这些系统调用的程序时,需要确保正确地处理返回值和错误情况。
5、创建守护进程
在Linux中,创建一个守护进程通常需要以下步骤:

  1. 在父进程中创建子进程:使用fork()系统调用创建一个子进程。子进程是父进程的副本,并且继承父进程的代码、数据和打开的文件描述符。
  2. 在子进程中创建新的会话:使用setsid()系统调用在子进程中创建一个新的会话。这将使子进程成为新的会话的领导者,并脱离父进程的控制终端。
  3. 设置 umask 为 0:使用umask()函数将文件模式创建掩码设置为0,以确保守护进程创建的文件具有适当的权限。
  4. 更改当前工作目录:使用chdir()系统调用将当前工作目录更改为根目录(/),以确保守护进程不会保持对原始工作目录的引用。
  5. 关闭不再需要的文件描述符:使用close()系统调用关闭父进程和子进程之间共享的文件描述符,例如标准输入、标准输出和标准错误输出。
  6. 设置新的标准输入、标准输出和标准错误输出:使用open()系统调用将标准输入、标准输出和标准错误输出重定向到适当的文件或设备。
  7. 设置进程组ID和会话ID:使用setpgid()和setsid()系统调用设置进程组ID和会话ID,以确保守护进程正确地与其他进程隔离。
  8. 将文件创建掩码重置为0:再次使用umask()函数将文件模式创建掩码重置为0,以确保守护进程创建的文件具有适当的权限。
  9. 进入主循环:在守护进程中编写主循环逻辑,以便它可以执行所需的任务。

这些步骤可以帮助您创建一个基本的守护进程。请注意,这只是一个基本的框架,您可能需要根据您的具体需求进行修改和扩展。此外,还应注意处理错误和异常情况,并确保正确释放资源。
6、用户空间、内核空间
Linux操作系统将虚拟内存分为两部分:用户空间和内核空间。

用户空间供各个进程使用,包括用户应用程序和操作系统内核模块(例如Linux内核)。每个进程都有其独立的用户空间,它们之间相互隔离且不能互相访问。在用户空间中,每个进程都有其自己的虚拟地址空间,并且可以通过系统调用进入内核空间。

内核空间是Linux内核使用的虚拟内存区域。它包括操作系统内核模块、设备驱动程序、内存管理系统等关键组件。内核空间对所有进程都是共享的,即所有进程都可以访问内核空间中的代码和数据。内核空间具有更高的权限级别,可以执行诸如管理内存、控制硬件设备等敏感操作。

用户空间和内核空间之间的转换需要通过系统调用完成。系统调用是用户空间进程和内核空间之间的接口,它允许用户空间进程将请求传递给内核,并使内核执行相应的操作。例如,当用户空间进程需要访问文件系统时,它会通过系统调用将请求传递给内核,然后内核会加载适当的文件系统模块并执行所需的操作。

需要注意的是,内核空间和用户空间都是虚拟内存,它们并不直接对应于物理内存。虚拟内存是一种内存管理技术,它通过将进程的虚拟地址映射到物理内存来实现内存的独立管理。这样,每个进程都有自己的独立虚拟地址空间,可以保护不同进程之间的数据和代码不相互干扰。

相关文章:

Linux学习笔记-应用层篇

1、Linux进程、线程概念/区别 Linux进程和线程是计算机系统中两种不同的资源分配和调度单位。 进程是计算机系统进行资源分配和调度的基本单位,也被认为是正在运行的程序。在面向线程的计算机结构中,进程是线程的容器。进程拥有独立的内存和系统资源&am…...

MySQL数据库的存储引擎

目录 一、存储引擎概念 二、存储引擎 2.1MyISAM 2.11MyISAM的特点 2.12MyISAM表支持3种不同的存储格式: 2.2 InnoDB 2.21InnoDB特点介绍 三、InnoDB与MyISAM 区别 四、怎么样选择存储引擎 五、查看存储引擎 六、查看表使用的存储引擎 七、修改存储引擎 …...

Linux-多路转接-epoll

epoll 接口认识epoll_createepoll_ctlepoll_wait epoll工作原理在内核中创建的数据结构epoll模型的一个完整工作流程 epoll工作模式LT-水平触发ET-边缘触发两种方式的对比 epoll的使用场景对于poll的改进惊群效应什么是惊群效应如何解决惊群效应原子操作/mutex/spinlock如何选择…...

Java面试被问了几个简单的问题,却回答的不是很好

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言 前几天参加了…...

概率论几种易混淆的形式

正态分布标准型 x − μ σ \frac{x - \mu}{\sigma} σx−μ​ 大数定律形式 P { X ≤ ∑ i 1 n x i − n μ n σ 2 } ∫ − ∞ X 1 2 π e − x 2 2 d x P\{X \le \frac{\sum_{i 1}^{n}x_i -n\mu}{\sqrt{n\sigma^2}} \} \int _{-\infty}^{X}\frac{1}{\sqrt{2\pi}}e^{-\fr…...

PyTorch数据增强后的结果展示

from PIL import Image import torch from torchvision import transformstrans transforms.Compose([transforms.ToTensor(), transforms.RandomErasing(p0.9, value 120, inplaceTrue)]) # 这里Compose是所做的变换img_path 02-56-45-060-1454-camra1.bmp img Image.open…...

指定程序在哪个GPU上运行

摘要: 当本地(或服务器)有个多个GPU时,需要指定程序在指定GPU上运行,需要做以下设置。 目录 一、在终端上指定GPU二、在程序中指定GPU三、系统变量指定GPU四、pytorch中指定GPU 一、在终端上指定GPU 在终端运行程序时…...

Linux CentOS7 vim多文件编辑

使用vim编辑多个文件,十分常用的操作。本文从打开、显示、切换文件到退出,进行简单讨论。 一、打开文件 1.一次打开多个文件 vim还没有启动的时候,在终端里输入vim file1 file2 … filen便可以打开所有想要打开的文件。 执行命令 vim fil…...

PAT甲级真题1153: 解码PAT准考证

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

linux信号

title: linux信号 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: SIGHUP 终止进程 终端线路挂断[喝小酒的网摘]http://blog.hehehehehe.cn/a/16999.htm SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生…...

JavaWeb开发-05-SpringBootWeb请求响应

一.请求 1.Postman 2.简单参数 ​ package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…...

Ubuntu下载

参考文档: 镜像文件:VMware下安装ubuntu 16.04(全步骤)_vmwaubuntu-16.04.4-desktop-amd64.iso_ST0new的博客-CSDN博客 vmware tools使用安装:VMware——VMware Tools的介绍及安装方法_William.csj的博客-CSDN博客 …...

Vue 的组件加载顺序和渲染顺序

1、结论先行 组件的加载顺序是自上而下的,也就是先加载父组件,再递归地加载其所有的子组件。 而组件渲染顺序是按照深度优先遍历的方式,也就是先渲染最深层的子组件,再依次向上渲染其父组件。 2、案例 下面是一个简单的示例代…...

leetcode Top100(17)矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…...

论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)

目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的:使机械臂在非结构化环境下实现端到端的自主学习控制…...

快速安装keepalive

快速安装keepalive #安装 yum install keepalived -y# 查看版本: rpm -q -a keepalived#修改配置文件 vim /etc/keepalived.conf虚拟 ip :随意选一个,不被占用的ip即可。...

nginx实现反向代理实例

1 前言 1.1 演示内容 在服务器上访问nginx端口然后跳转到tomcat服务器 1.2 前提条件 前提条件:利用docker安装好nginx、tomcat、jdk8(tomcat运行需要jdk环境) 只演示docker安装tomcat: 默认拉取最新版tomcat docker pull t…...

使用Freemarker填充模板导出复杂Excel,其实很简单哒!

文章目录 1. 需求分析2. 对象生成3. 列表插值4. 另存xml格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析 类似这样的一个表格 我们需要从数据库中查询对应的数据,将其汇总进该表格,并且可能还需要复制表格项,我这个案例中没有&a…...

windows环境下安装logstash同步数据,注册系统服务

windows环境下安装logstash同步数据,注册系统服务 此方法适用于Windows环境,同一个配置文件配置多个管道,并且配置系统服务,防止程序被杀进程 一、安装logstash (1)下载压缩包,解压后修改con…...

java服务内存说明及配置详解

java进程内存 JVM内存分布图: 【java进程内存】【堆外内存】 【jvm堆内存】 【堆外内存】 【Metaspace】 【Direct Memory】【JNI Memory】【code_cache】 … 堆外内存泄漏的排查在于【本地内存(Native Memory)】【Direct Memory】【JNI Memory】 一般…...

Mybatis-MyBatis的缓存

Mybatis-MyBatis的缓存 一、MyBatis的一级缓存二、MyBatis的二级缓存二级缓存的相关配置 三、MyBatis缓存查询的顺序 一、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从…...

计算机组成原理之硬件的基本组成,深入介绍两大计算机结构体系,从底层出发认识计算机。

大家好,欢迎阅读《计算机组成原理》的系列文章,本系列文章主要的内容是从零学习计算机组成原理,内容通俗易懂,大家好好学习吧!!! 更多的优质内容,请点击以下链接查看哦~~ ↓ ↓ ↓ …...

二十五、MySQL事务的四大特性和常见的并发事务问题

1、事务的四大特性 2、常见的并发事务问题 (1)并发事务问题分类: (2)脏读: 一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;…...

辨析常见的医学数据分析(相关性分析回归分析)

目录 1 常见的三种分类结果? 2 什么是相关性分析? 相关性分析的结果怎么看? 3 什么是回归分析? 1)前提 2)常见的回归模型 4 对于存在对照组实验的医学病例如何分析? 1)卡方检验…...

SpringBoot项目中只执行一次的任务写法

SpringBoot项目中只执行一次的任务写法 有时候我们需要进行初始化工作,就说明只要进行一次的工作,那么,在Springboot项目中如何做到任务只进行一次呢 利用定时任务 在Spring Boot项目中,你可以使用Spring框架提供的Scheduled注解…...

TCK、TMS、TDI、TDO的含义

这四个信号是JTAG(Joint Test Action Group)界面的一部分。JTAG是一种用于测试和验证集成电路和印刷电路板的技术,也用于进行设备编程和调试。这四个信号分别是: TCK (Test Clock): 意义:测试时钟&#xff…...

R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...

全文链接:http://tecdat.cn/?p24456 如果你正在进行统计分析:想要加一些先验信息,最终你想要的是预测。所以你决定使用贝叶斯(点击文末“阅读原文”获取完整代码数据)。 相关视频 但是,你没有共轭先验。你…...

【PowerShell】PowerShell的Core版本的额外配置

在PowerShell 7.1 安装完成后,默认情况下打开PowerShell 会直接进入到系统内置的PowerShell,如果希望通过远程连接或者PowerShell Web Access 进入到PowerShell 7环境的界面,就需要进行环境的再配置才能实现PowerShell 7.1 的环境连接。需要为外部的环境提供连接的话需要按照…...

数据结构----链式栈

目录 前言 链式栈 操作方式 1.存储结构 2.初始化 3.创建节点 4.判断是否满栈 5.判断是否空栈 6.入栈 7.出栈 8.获取栈顶元素 9.遍历栈 10.清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法,(链接:线性表-----栈(栈…...

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是,过去以为AI智能化、大模型技术是很高深的事情。但现在,我们通过RPA等数字化工具,自主根据自己的工作岗位,完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…...

网站正在建设中 htmll/二十四个关键词

未找到有效的解决方案 但是word倒是可以解决这个问题...

网络拓扑图/百度seo如何优化

重载运算符 重载运算符的本质是函数,其名字由operator关键字后接表示要定义的运算符的符号组成。 因此,赋值运算符就是一个名为operator的函数。 类似于任何其他的函数,重载运算符函数也有一个返回类型和一个参数列表。 重载运算符的参数是…...

旅行网站定制公司/军事新闻最新24小时

命令作用: echo命令可以用于在屏幕上显示相关的文字信息,也可以用于显示批处理文件执行过程中的命令 命令格式: echo [{on|off}] [message] 参数说明: on: 允许窗口显示执行命令 off: 禁止窗口显示执行命令 message: 显示在…...

海南省城乡建设厅网站首页/游戏推广赚钱

原文请详见:http://www.ucai.cn/blogdetail/7033?mid1&f5 能够在线执行查看效果哦! 今天这堂课,分为三个大点,正如标题所指出的,是讨论数据的本质、概念与应用实践。第一点本质的探讨是站在一个更高的高度来分析数…...

英文网站/网站平台有哪些

Option ExplicitPrivate Sub Command1_Click()Static j As Integerj j 1 j用于计数,每次单击Command命令按钮加1。If j > 3 ThenMsgBox "只能运行3次"Exit SubEnd IfDim i As Integeri Val(InputBox("请输入数字1-3"))Sel…...

丹东淘宝做网站/十大网络推广公司排名

提示:这是MyBatis的第三篇,有兴趣的话可以看下: 一:MyBatis复习笔记整理 二:MyBatis的resultMap标签 自定义封装返回值类型 文章目录MyBatis动态SQL官方文档1、if2、choose、when、otherwise3、trim、where、set4、for…...