Ubuntu 查看端口占用

Ubuntu 查看端口占用

1 查看服务端口

1.1 查看已经连接的服务端口(ESTABLISHED):

$ netstat -a

1.2 查看所有的服务端口(LISTEN,ESTABLISHED):

$ netstat -ap

2 查看指定端口

查看指定端口,可以结合grep命令:

$ netstat -ap | grep 8080        

也可以使用lsof命令:

$ lsof -i:8080

3 关闭端口使用

若要关闭使用这个端口的程序,使用kill + 对应的pid::

$ kill -9 [PID]

ps:kill就是给某个进程id发送了一个信号。默认发送的信号是SIGTERM,而kill -9发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。

注:此命令在CentOS下同样适用。

Ubuntu18.04服务器部署Docker

Ubuntu18.04服务器部署Docker

1.更新包索引

$ sudo apt-get updata

2.安装必要包(curl等)

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

3.添加Docker官方GPG Key

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

确认一下指纹:

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

4.针对x84_64系统安装最新稳定版本:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

5.再更新一次包索引

$ sudo apt-get updata

6.安装docker engine

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

等待就完成了~

C++之父:链表是原罪吗?

翻译改编自https://isocpp.org/blog/2014/06/stroustrup-lists

链表是原罪吗?

作者:Bjarne Stroustrup

根据Web的某些角落,我的印象是向量总是比链表更好,而且我不了解其他数据结构,例如树(例如std::set)和哈希表(例如std::unordered_map)。显然,那是荒谬的。

问题似乎是约翰·本特利曾向我提出的一个有趣的小练习:将一系列随机整数插入到一个排序的序列中,然后按照原位置的顺序逐个删除这些元素定:你是否使用了vector(连续分配的元素序列)或list?我用这个例子来说明一些观点,鼓励思考算法,数据结构和机器架构,得出结论:

  • 不要不必要地存储数据
  • 保持数据紧凑
  • 以可预测的方式访问内存。

注意结论中没有vectorlist。请不要将示例与示例中的示例混淆。

这个例子的目的是说明一些一般原则并让人们思考。最初,大多数人说“当然选择list!”(我已经多次尝试过这个问题),因为“中间”有许多插入和删除(list很擅长)。这个答案是完全错误的。

我多年来一直在使用这个例子,并且让研究生实施并测量了这个练习和不同练习的几十种变体。其他人的例子和测量可以在网上找到。

  • 我尝试了map(它们比list要好得多,但仍比vector慢)
  • 我已经尝试了更大的元素大小
  • 我使用Binary Search和暴力插入向量(是的,它们甚至进一步加速)
  • 我查看了我的理论(不,我没有违反任何大O复杂性规则;只是某些操作对于一个数据结构而言比另一个更加昂贵)
  • 我有预先分配的链接(这比std::list遍历仍然性能更好)
  • 我使用了单链表forward_lists,(这没有多大区别,但是确保用户代码100%相当有点难度)
  • 我知道(并且说)500K列表并不常见(但这对我的要点无关紧要)。我们使用许多结构(大型和小型),其中可以选择链接和连续的表示。
  • 我知道listpush_front()更快,vectorpush_back()更快

我的观点不是关于列表。它们有它们的用途,但这个例子不是其中之一。请不要将示例与示例用于说明的内容混淆。这个例子是关于内存的使用:我们经常创建一个数据结构,对它进行一些需要访问的计算(通常是遍历),然后删除它。有序序列只是这种用法的一个例子,并且提供了示例以让人们思考在这种情况下重要的事情。我的建议是:

  • 不要不必要地存储数据
  • 保持数据紧凑
  • 以可预测的方式访问内存。

我强调cache的重要性。根据我的经验,除了真正的专家外,所有人都倾向于在讨论算法时忘记这些。

而且,是的,我的推荐是默认使用std::vector。更一般地说,除非有充分的理由不使用,否则请使用连续的表示。与C一样,C++默认设计用于执行此操作。

此外,请不要在没有测量的情况下对性能做出声明。我已经看到过这样一种情况,即将0-2元素列表更改为0-2元素向量会使算法产生因子2的差异。Nobody cares this.

C/C++ 获取CPU核心数

有时候我们的多线程程序要确定并发数(线程数), 这时候我们可能比较关心当前环境CPU核心数

Windows

Windows为我们提供了一些API, 比如GetSystemInfo(), 可以获得当前系统的一些信息, 这个函数包含在<windows.h>中, 然后获取其中的dwNumberOfProcessors成员即可

#if defined(_WIN32)
SYSTEM_INFO info;
GetSystemInfo (&info);
return info.dwNumberOfProcessors;

Linux

Linux则更加方便, 直接调用GNU函数get_nprocs()即可

Code

所以代码如下:

int get_cpu_cores()
{
#if defined(_WIN32)
    SYSTEM_INFO info;
    GetSystemInfo (&info);
    return info.dwNumberOfProcessors;
#elif defined(LINUX) || defined(SOLARIS) || defined(AIX)
    return get_nprocs();   //GNU fuction
#else
#error  UNKNOWN OS!
#endif
}

并发与并行

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。

在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。

我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

摘自:《并发的艺术》 — 〔美〕布雷谢斯